package com.xl.cloud.netty.nio;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @Author XiangLiang
 * @Since 2025/1/9 14:16
 * @Description: MappedByteBuffer类 - MappedByteBuffer可让文件直接在内存(堆外内存)修改，操作系统不需要拷贝一次
 */
public class MappedByteBufferTest {
    public static void main(String[] args) throws Exception {
        RandomAccessFile randomAccessFile = new RandomAccessFile("D:\\file01.txt", "rw");
        FileChannel fileChannel = randomAccessFile.getChannel();

        /*
        参数 1: FileChannel.MapMode.READ_WRITE 使用的读写模式
        参数 2:   0:可以直接修改的起始位置
        参数 3:   5:是映射到内存的大小(不是索引位置)即将 1.txt的多少个字节映射到内存
        可以直接修改的范围就是0-5
        实际类型 DirectByteBuffer
        */
        MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 5);
        mappedByteBuffer.put(0, (byte) 'h');
        mappedByteBuffer.put(3, (byte) '9');
        // 这里会报错，IndexOutOfBoundsException
        // mappedByteBuffer.put(5, (byte) 'Y');
        randomAccessFile.close();
        System.out.println("修改成功~");
    }
}
